/**
 * router.js处理业务逻辑
 */
const fs = require('fs'); // 文件系统模块
const http = require('http'); // 
const { serviceHost, mockDir } = require('./config');

module.exports = {
  getPage: (req, res, filePath) => {
    // 返回pages下静态资源
    fs.readFile(`src/middle-layer/pages${filePath}.html`,
      (err, buffer) => {
        if (err) {
          res.write('this page is not found');
        } else {
          res.write(buffer);
        }
        res.end(); // 这是请求结束，如果没有这句，请求会一直等待
      });
  },
  addApi: (req, res, params) => {
    // 新增mock api，并保存api的请求响应格式
    const { url, req: reqData, res: resData } = params;
    // stringfy() 第三个参数用换行符'\t'美化文本，
    // 也可以是数字指定缩进的空格数（大于10则缩进10个空格）
    const data = JSON.stringify({
      req: JSON.parse(reqData),
      res: JSON.parse(resData),
    }, '', '\t');
    // 根据命名规范设置文件名称
    const fileName = url.replace('/', '_');
    // 将请求数据、响应数据写到json文件中，如果该文件没有，会新建一个json文件
    fs.writeFile(`${mockDir}/${fileName}.json`,
      data,
      'utf-8',
      (err) => {
        if (err) {
          console.log(err);
        }
      });
    // 非阻塞io，不受文件读写影响
    // 设置请求头
    res.writeHead(200, { 'Content-Type': 'application/json' });
    // 返回json字符串
    res.write(JSON.stringify({
      status: true,
      message: "提交成功",
    }));
    // 响应结束
    res.end();
  },
  removeApi: (req, res, params) => {
    const { url } = params;
    const apiFile = `${url.replace('/', '_')}.json`;

    fs.unlink(`${mockDir}/${apiFile}`, function(err){
      if(err){
          throw err;
      }
      res.writeHead(200, { 'Content-Type': 'application/json' });
      res.write(JSON.stringify({
        status: true,
        message: "删除成功",
      }));
      res.end();
    });
  },
  queryApiList: (req, res) => {
    // 获取所有mock api名称
    const apiFiles = fs.readdirSync(mockDir); // 读取文件夹下的所有文件名
    // 处理文件名，将'_'改为'/'后返回api名称数组
    const apis = apiFiles.map((path) =>
      path.slice(0, -5).replace('_', '/'));
    res.writeHead(200, {
      'Content-Type': 'application/json',
    });
    res.write(JSON.stringify({
      status: true,
      data: apis,
    }));
    res.end();
  },
  queryApiDetail: (req, res, params) => {
    // 根据api名称获取对应mock api的请求响应格式
    const { url } = params; // url为mock api名称
    const fileName = url.replace('/', '_');
    fs.readFile(`${mockDir}/${fileName}.json`,
      (err, data) => {
        // 获取请求响应格式对象object
        const apiParams = JSON.parse(data.toString());
        res.writeHead(200, {
          'Content-Type': 'application/json',
        });
        res.write(JSON.stringify({
          status: true,
          data: apiParams,
        }));
        res.end();
      })
  },
  getTrueApi: (req, res, url) => {
    // 使用http get方法转发服务端请求
    http.get(`${serviceHost}${url}`, (response) => {
      // 包装响应数据
      const { statusCode } = response;
      if (statusCode === 200) {
        response.setEncoding('utf-8');
        let rawData = '';
        // data 传送数据
        response.on('data', (chunk) => { rawData += chunk; });
        response.on('end', () => {
          // 分段传送，传递过来的是碎片，我们需要重新组装
          try {
            // 转成JSON对象
            const parsedData = JSON.parse(rawData);
            res.writeHead(200, { 'Content-Type': 'application/json' });
            res.write(JSON.stringify(parsedData));
            res.end();
          } catch (e) {
            console.error(e.message);
          }
        });
      } else { }
    });
  },
};